const whiteList = ["/login", "/register"];
module.exports = () => {
    // 返回一个中间件函数（异步函数）
    return async (ctx, next) => {
        // 如果不在白名单
        if (!whiteList.includes(ctx.path)) {
            // 获取前端传入的 token
            const token = ctx.headers.token;

            // 如果没有 token，又没在白名单内，就直接返回
            if (!token) {
                ctx.body = {
                    code: 401,
                    message: "缺少 token 字段",
                };
                return;
            }

            // 有 token，那么就校验 token 合法性，并从 token 中获取用户信息
            try {
                // 没有报错，就拿到了用户的信息
                const user = ctx.helper.checkToken(token);
                // 挂载到 ctx 上，以便控制层和服务层使用
                ctx.user = user;
            } catch (error) {
                if (error.name === "TokenExpiredError") {
                    ctx.body = {
                        code: 401,
                        message: "token已过期，请重新获取",
                    };
                    return;
                }

                if (error.name === "JsonWebTokenError") {
                    ctx.body = {
                        code: 401,
                        message: "你小子不老实",
                    };
                    return;
                }
            }
        }
        // 向下执行
        await next();
    };
};
